package br.uniminas.persistencia;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import br.uniminas.entidades.Produto;

public class ProdutoDao {

	private List<Produto> listaProdutos;
	private Produto produto;
	private Session session = HibernateUtil.getSessionFactory()
			.getCurrentSession();

	public List todosProd() {
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			listaProdutos = session.createQuery("from Produto").list();
			return listaProdutos;
		} finally {
			session.close();
		}
	}

	public List getAllProduto() {
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			listaProdutos = session.createQuery("from Produto").list();
			return listaProdutos;
		} finally {
			session.close();
		}
	}

	public Produto getProduto(Integer id) {
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query q = session.createQuery("from Produto as e where e.id =:id");
			q.setInteger("id", id);
			return (Produto) q.uniqueResult();
		} finally {
			session.close();
		}
	}
	
	public Produto pegaProduto(int codigoDeBarra) {
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query q = session.createQuery("from Produto as e where e.codigoDeBarra =:codigoDeBarra");
			q.setInteger("codigoDeBarra", codigoDeBarra);
			return (Produto) q.uniqueResult();
		} finally {
			session.close();
		}
	}

	public List<Produto> buscaProdutoPorCodBarra(int codigoDeBarra) {
		System.out.println(codigoDeBarra);
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query q = session.createQuery("from Produto as f where f.codigoDeBarra like :codigoDeBarra");
			q.setString("codigoDeBarra", "%"+codigoDeBarra+"%");
			List l = q.list();
			return l;
		} finally {
			session.close();
		}
	}
	
	public List<Produto> buscaProdutoPorTipo(String tipo) {
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query q = session
					.createQuery("from Produto as f where f.tipo = :tipo");
			q.setString("tipo", "%" + tipo + "%");
			List l = q.list();
			return l;
		} finally {
			session.close();
		}
	}

	public List<Produto> buscaProdutoPorNome(String descricao) {
		System.out.println(descricao);
		session = HibernateUtil.getSessionFactory().openSession();
		try {
			session.beginTransaction();
			Query q = session
					.createQuery("from Produto as f where f.descricao like :descricao");
			q.setString("descricao", "%" + descricao + "%");
			List l = q.list();
			return l;
		} finally {
			session.close();
		}
	}

	public void criaRegistroProd(Produto pro) {
		session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.save(pro);
			tx.commit();
		} catch (RuntimeException e) {
			if (tx != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}
	}

	public void deletePro(Integer id) {
		session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			produto = (Produto) session.get(Produto.class, id);
			session.delete(produto);
			tx.commit();
		} catch (RuntimeException e) {
			if (tx != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}
	}

	public void updatePro(Produto prod) {
		session = HibernateUtil.getSessionFactory().openSession();
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.update(prod);
			tx.commit();
		} catch (RuntimeException e) {
			if (tx != null)
				tx.rollback();
			throw e;
		} finally {
			session.close();
		}
	}
}
